home *** CD-ROM | disk | FTP | other *** search
/ Amiga Collections: Topik / Topik - Disk 39 - Educational (19xx)(Topik Public Domain)(PD)[a][WB].zip / Topik - Disk 39 - Educational (19xx)(Topik Public Domain)(PD)[a][WB].adf / WorldMap / map.c < prev    next >
C/C++ Source or Header  |  1978-05-25  |  41KB  |  1,881 lines

  1. #define REVISED
  2.  
  3. /****************************************************************************
  4.  
  5.  
  6. CARTOG.PAS Accompanies "Mapping the World in Pascal" by Robert Miller
  7.     and Francis Reddy, BYTE, December 1987, page 329
  8.  
  9.  
  10. ****************************************************************************/
  11.  
  12.  
  13.  
  14. /*
  15. PROGRAM Cartog;
  16.  This program plots geographic data from the file
  17.   WORLD.DAT and coordinate grids on the Mercator,
  18.   Equidistant Cylindrical, Sinusoidal, Hammer, and
  19.   Orthographic map projections.
  20. */
  21.  
  22. /***************************************************************************
  23.  
  24.                             ye olde notice:
  25.  
  26.         This Program  (Was,Has Yet,Has,'s,Should Have,Is,,Cares,Believes)
  27.  
  28. 1.  TRANSLATED (poorly & quickly) TO MANX AZTEC C AMIGA, USING VICIOUS
  29.     CUT & PASTE/SEARCH-REPLACE TACTICS.
  30. 2.  TO BE SETUP FOR 68020/68881, but won't run without.
  31. 3.  ORIGINAL PASCAL SOURCE CODE AS worldmap.txt FOR REFERENCE.
  32. 4.  author/translator DECRIES/DENIES ANY KNOWLEDGE OF PASCAL.
  33. 5.  ASSIGN MAP: DEV:PATH        where the world.dat file is.
  34. 6.  SETUP FOR ORIGINAL LOW RESOLUTION world.dat FILE. IF YOU HAVE OBTAINED
  35.     ONE OF THE HIGHER RESOLUTION VERSIONS, CHANGE DFSIZE TO REFLECT THIS.
  36. 7.  USES A DEFAULT MAP CENTER = MY ADDRESS.
  37. 8.  NOT FOR MEMORY RESTRAINTS.
  38. 9.  IN AN UNLIMITED SUPPLY OF CPU CYCLES.
  39.  
  40.                          end of ye olde notice
  41.  
  42. ***************************************************************************/
  43.  
  44.  
  45.  
  46. #include <exec/types.h>
  47. #include <exec/nodes.h>
  48. #include <exec/lists.h>
  49. #include <exec/memory.h>
  50. #include <exec/interrupts.h>
  51. #include <exec/ports.h>
  52. #include <exec/libraries.h>
  53. #include <exec/devices.h>
  54. #include <exec/io.h>
  55. #include <libraries/dosextens.h>
  56. #include <graphics/gfxbase.h>
  57. #include <graphics/gfxmacros.h>
  58. #include <intuition/intuition.h>
  59. #include <devices/timer.h>
  60. #include <clib/macros.h>
  61. #include <math.h>
  62.  
  63.  
  64. /*#define DEBUG*/
  65.  
  66. #define XSIZE          639
  67. #define YSIZE          399
  68. #define DFSIZE       45366L     /* world.dat size in bytes, */
  69. #define DPOINTS      DFSIZE/6   /*  7561 data points */
  70.  
  71. Enable_Abort = 0;
  72.  
  73. UBYTE titlemain[]  = "                       \
  74. AMIGA WORLD MAPPER  -V0.0- ";
  75.  
  76. UBYTE anytext[81];
  77. struct IntuiText anyprint = {
  78. 1, 2,             /* front/back pens */
  79. JAM2,             /* draw mode       */
  80. 0, 0,             /* left,top edge   */
  81. NULL,             /* default font    */
  82. anytext,          /* text string     */
  83. NULL              /* next string     */
  84. };
  85.  
  86.  
  87.  
  88. struct IntuiText IText1 = {
  89.         3,1,COMPLEMENT,
  90.         20,1,
  91.         NULL,
  92.         (UBYTE *)" -180 ",
  93.         NULL
  94. };
  95.  
  96. struct MenuItem SubItem13 = {
  97.         NULL,
  98.         45,112,
  99.         68,10,
  100.         CHECKIT+ITEMTEXT+ITEMENABLED+HIGHCOMP,
  101.         0xffffefff,
  102.         (APTR)&IText1,
  103.         NULL,
  104.         NULL,
  105.         NULL,
  106.         0xFFFF
  107. };
  108.  
  109. struct IntuiText IText2 = {
  110.         3,1,COMPLEMENT,
  111.         20,1,
  112.         NULL,
  113.         (UBYTE *)" -150 ",
  114.         NULL
  115. };
  116.  
  117. struct MenuItem SubItem12 = {
  118.         &SubItem13,
  119.         45,102,
  120.         68,10,
  121.         CHECKIT+ITEMTEXT+ITEMENABLED+HIGHCOMP,
  122.         0xfffff7ff,
  123.         (APTR)&IText2,
  124.         NULL,
  125.         NULL,
  126.         NULL,
  127.         0xFFFF
  128. };
  129.  
  130. struct IntuiText IText3 = {
  131.         3,1,COMPLEMENT,
  132.         20,1,
  133.         NULL,
  134.         (UBYTE *)" -120 ",
  135.         NULL
  136. };
  137.  
  138. struct MenuItem SubItem11 = {
  139.         &SubItem12,
  140.         45,92,
  141.         68,10,
  142.         CHECKIT+ITEMTEXT+ITEMENABLED+HIGHCOMP,
  143.         0xfffffbff,
  144.         (APTR)&IText3,
  145.         NULL,
  146.         NULL,
  147.         NULL,
  148.         0xFFFF
  149. };
  150.  
  151. struct IntuiText IText4 = {
  152.         3,1,COMPLEMENT,
  153.         20,1,
  154.         NULL,
  155.         (UBYTE *)"  -90 ",
  156.         NULL
  157. };
  158.  
  159. struct MenuItem SubItem10 = {
  160.         &SubItem11,
  161.         45,82,
  162.         68,10,
  163.         CHECKED+CHECKIT+ITEMTEXT+ITEMENABLED+HIGHCOMP,
  164.         0xfffffdff,
  165.         (APTR)&IText4,
  166.         NULL,
  167.         NULL,
  168.         NULL,
  169.         0xFFFF
  170. };
  171.  
  172. struct IntuiText IText5 = {
  173.         3,1,COMPLEMENT,
  174.         20,1,
  175.         NULL,
  176.         (UBYTE *)"  -60 ",
  177.         NULL
  178. };
  179.  
  180. struct MenuItem SubItem9 = {
  181.         &SubItem10,
  182.         45,72,
  183.         68,10,
  184.         CHECKIT+ITEMTEXT+ITEMENABLED+HIGHCOMP,
  185.         0xfffffeff,
  186.         (APTR)&IText5,
  187.         NULL,
  188.         NULL,
  189.         NULL,
  190.         0xFFFF
  191. };
  192.  
  193. struct IntuiText IText6 = {
  194.         3,1,COMPLEMENT,
  195.         20,1,
  196.         NULL,
  197.         (UBYTE *)"  -30 ",
  198.         NULL
  199. };
  200.  
  201. struct MenuItem SubItem8 = {
  202.         &SubItem9,
  203.         45,62,
  204.         68,10,
  205.         CHECKIT+ITEMTEXT+ITEMENABLED+HIGHCOMP,
  206.         0xffffff7f,
  207.         (APTR)&IText6,
  208.         NULL,
  209.         NULL,
  210.         NULL,
  211.         0xFFFF
  212. };
  213.  
  214. struct IntuiText IText7 = {
  215.         3,1,COMPLEMENT,
  216.         20,1,
  217.         NULL,
  218.         (UBYTE *)"    0 ",
  219.         NULL
  220. };
  221.  
  222. struct MenuItem SubItem7 = {
  223.         &SubItem8,
  224.         45,52,
  225.         68,10,
  226.         CHECKIT+ITEMTEXT+ITEMENABLED+HIGHCOMP,
  227.         0xffffffbf,
  228.         (APTR)&IText7,
  229.         NULL,
  230.         NULL,
  231.         NULL,
  232.         0xFFFF
  233. };
  234.  
  235. struct IntuiText IText8 = {
  236.         3,1,COMPLEMENT,
  237.         20,1,
  238.         NULL,
  239.         (UBYTE *)"   30 ",
  240.         NULL
  241. };
  242.  
  243. struct MenuItem SubItem6 = {
  244.         &SubItem7,
  245.         45,42,
  246.         68,10,
  247.         CHECKIT+ITEMTEXT+ITEMENABLED+HIGHCOMP,
  248.         0xffffffdf,
  249.         (APTR)&IText8,
  250.         NULL,
  251.         NULL,
  252.         NULL,
  253.         0xFFFF
  254. };
  255.  
  256. struct IntuiText IText9 = {
  257.         3,1,COMPLEMENT,
  258.         20,1,
  259.         NULL,
  260.         (UBYTE *)"   60 ",
  261.         NULL
  262. };
  263.  
  264. struct MenuItem SubItem5 = {
  265.         &SubItem6,
  266.         45,32,
  267.         68,10,
  268.         CHECKIT+ITEMTEXT+ITEMENABLED+HIGHCOMP,
  269.         0xffffffef,
  270.         (APTR)&IText9,
  271.         NULL,
  272.         NULL,
  273.         NULL,
  274.         0xFFFF
  275. };
  276.  
  277. struct IntuiText IText10 = {
  278.         3,1,COMPLEMENT,
  279.         20,1,
  280.         NULL,
  281.         (UBYTE *)"   90 ",
  282.         NULL
  283. };
  284.  
  285. struct MenuItem SubItem4 = {
  286.         &SubItem5,
  287.         45,22,
  288.         68,10,
  289.         CHECKIT+ITEMTEXT+ITEMENABLED+HIGHCOMP,
  290.         0xfffffff7,
  291.         (APTR)&IText10,
  292.         NULL,
  293.         NULL,
  294.         NULL,
  295.         0xFFFF
  296. };
  297.  
  298. struct IntuiText IText11 = {
  299.         3,1,COMPLEMENT,
  300.         20,1,
  301.         NULL,
  302.         (UBYTE *)"  120 ",
  303.         NULL
  304. };
  305.  
  306. struct MenuItem SubItem3 = {
  307.         &SubItem4,
  308.         45,12,
  309.         68,10,
  310.         CHECKIT+ITEMTEXT+ITEMENABLED+HIGHCOMP,
  311.         0xfffffffb,
  312.         (APTR)&IText11,
  313.         NULL,
  314.         NULL,
  315.         NULL,
  316.         0xFFFF
  317. };
  318.  
  319. struct IntuiText IText12 = {
  320.         3,1,COMPLEMENT,
  321.         20,1,
  322.         NULL,
  323.         (UBYTE *)"  150 ",
  324.         NULL
  325. };
  326.  
  327. struct MenuItem SubItem2 = {
  328.         &SubItem3,
  329.         45,2,
  330.         68,10,
  331.         CHECKIT+ITEMTEXT+ITEMENABLED+HIGHCOMP,
  332.         0xfffffffd,
  333.         (APTR)&IText12,
  334.         NULL,
  335.         NULL,
  336.         NULL,
  337.         0xFFFF
  338. };
  339.  
  340. struct IntuiText IText13 = {
  341.         3,1,COMPLEMENT,
  342.         20,1,
  343.         NULL,
  344.         (UBYTE *)"  180 ",
  345.         NULL
  346. };
  347.  
  348. struct MenuItem SubItem1 = {
  349.         &SubItem2,
  350.         45,-8,
  351.         68,10,
  352.         CHECKIT+ITEMTEXT+ITEMENABLED+HIGHCOMP,
  353.         0xfffffffe,
  354.         (APTR)&IText13,
  355.         NULL,
  356.         NULL,
  357.         NULL,
  358.         0xFFFF
  359. };
  360.  
  361. struct IntuiText IText14 = {
  362.         3,1,COMPLEMENT,
  363.         20,1,
  364.         NULL,
  365.         (UBYTE *)" LNG ",
  366.         NULL
  367. };
  368.  
  369. struct MenuItem MenuItem2 = {
  370.         NULL,
  371.         0,11,
  372.         60,10,
  373.         ITEMTEXT+ITEMENABLED+HIGHCOMP,
  374.         0,
  375.         (APTR)&IText14,
  376.         NULL,
  377.         NULL,
  378.         &SubItem1,
  379.         0xFFFF
  380. };
  381.  
  382. struct IntuiText IText15 = {
  383.         3,1,COMPLEMENT,
  384.         20,1,
  385.         NULL,
  386.         (UBYTE *)" -90 ",
  387.         NULL
  388. };
  389.  
  390. struct MenuItem SubItem26 = {
  391.         NULL,
  392.         45,112,
  393.         60,10,
  394.         CHECKIT+ITEMTEXT+ITEMENABLED+HIGHCOMP,
  395.         0xffffefff,
  396.         (APTR)&IText15,
  397.         NULL,
  398.         NULL,
  399.         NULL,
  400.         0xFFFF
  401. };
  402.  
  403. struct IntuiText IText16 = {
  404.         3,1,COMPLEMENT,
  405.         20,1,
  406.         NULL,
  407.         (UBYTE *)" -75 ",
  408.         NULL
  409. };
  410.  
  411. struct MenuItem SubItem25 = {
  412.         &SubItem26,
  413.         45,102,
  414.         60,10,
  415.         CHECKIT+ITEMTEXT+ITEMENABLED+HIGHCOMP,
  416.         0xfffff7ff,
  417.         (APTR)&IText16,
  418.         NULL,
  419.         NULL,
  420.         NULL,
  421.         0xFFFF
  422. };
  423.  
  424. struct IntuiText IText17 = {
  425.         3,1,COMPLEMENT,
  426.         20,1,
  427.         NULL,
  428.         (UBYTE *)" -60 ",
  429.         NULL
  430. };
  431.  
  432. struct MenuItem SubItem24 = {
  433.         &SubItem25,
  434.         45,92,
  435.         60,10,
  436.         CHECKIT+ITEMTEXT+ITEMENABLED+HIGHCOMP,
  437.         0xfffffbff,
  438.         (APTR)&IText17,
  439.         NULL,
  440.         NULL,
  441.         NULL,
  442.         0xFFFF
  443. };
  444.  
  445. struct IntuiText IText18 = {
  446.         3,1,COMPLEMENT,
  447.         20,1,
  448.         NULL,
  449.         (UBYTE *)" -45 ",
  450.         NULL
  451. };
  452.  
  453. struct MenuItem SubItem23 = {
  454.         &SubItem24,
  455.         45,82,
  456.         60,10,
  457.         CHECKIT+ITEMTEXT+ITEMENABLED+HIGHCOMP,
  458.         0xfffffdff,
  459.         (APTR)&IText18,
  460.         NULL,
  461.         NULL,
  462.         NULL,
  463.         0xFFFF
  464. };
  465.  
  466. struct IntuiText IText19 = {
  467.         3,1,COMPLEMENT,
  468.         20,1,
  469.         NULL,
  470.         (UBYTE *)" -30 ",
  471.         NULL
  472. };
  473.  
  474. struct MenuItem SubItem22 = {
  475.         &SubItem23,
  476.         45,72,
  477.         60,10,
  478.         CHECKIT+ITEMTEXT+ITEMENABLED+HIGHCOMP,
  479.         0xfffffeff,
  480.         (APTR)&IText19,
  481.         NULL,
  482.         NULL,
  483.         NULL,
  484.         0xFFFF
  485. };
  486.  
  487. struct IntuiText IText20 = {
  488.         3,1,COMPLEMENT,
  489.         20,1,
  490.         NULL,
  491.         (UBYTE *)" -15 ",
  492.         NULL
  493. };
  494.  
  495. struct MenuItem SubItem21 = {
  496.         &SubItem22,
  497.         45,62,
  498.         60,10,
  499.         CHECKIT+ITEMTEXT+ITEMENABLED+HIGHCOMP,
  500.         0xffffff7f,
  501.         (APTR)&IText20,
  502.         NULL,
  503.         NULL,
  504.         NULL,
  505.         0xFFFF
  506. };
  507.  
  508. struct IntuiText IText21 = {
  509.         3,1,COMPLEMENT,
  510.         20,1,
  511.         NULL,
  512.         (UBYTE *)"   0 ",
  513.         NULL
  514. };
  515.  
  516. struct MenuItem SubItem20 = {
  517.         &SubItem21,
  518.         45,52,
  519.         60,10,
  520.         CHECKIT+ITEMTEXT+ITEMENABLED+HIGHCOMP,
  521.         0xffffffbf,
  522.         (APTR)&IText21,
  523.         NULL,
  524.         NULL,
  525.         NULL,
  526.         0xFFFF
  527. };
  528.  
  529. struct IntuiText IText22 = {
  530.         3,1,COMPLEMENT,
  531.         20,1,
  532.         NULL,
  533.         (UBYTE *)"  15 ",
  534.         NULL
  535. };
  536.  
  537. struct MenuItem SubItem19 = {
  538.         &SubItem20,
  539.         45,42,
  540.         60,10,
  541.         CHECKIT+ITEMTEXT+ITEMENABLED+HIGHCOMP,
  542.         0xffffffdf,
  543.         (APTR)&IText22,
  544.         NULL,
  545.         NULL,
  546.         NULL,
  547.         0xFFFF
  548. };
  549.  
  550. struct IntuiText IText23 = {
  551.         3,1,COMPLEMENT,
  552.         20,1,
  553.         NULL,
  554.         (UBYTE *)"  30 ",
  555.         NULL
  556. };
  557.  
  558. struct MenuItem SubItem18 = {
  559.         &SubItem19,
  560.         45,32,
  561.         60,10,
  562.         CHECKIT+ITEMTEXT+ITEMENABLED+HIGHCOMP,
  563.         0xffffffef,
  564.         (APTR)&IText23,
  565.         NULL,
  566.         NULL,
  567.         NULL,
  568.         0xFFFF
  569. };
  570.  
  571. struct IntuiText IText24 = {
  572.         3,1,COMPLEMENT,
  573.         20,1,
  574.         NULL,
  575.         (UBYTE *)"  45 ",
  576.         NULL
  577. };
  578.  
  579. struct MenuItem SubItem17 = {
  580.         &SubItem18,
  581.         45,22,
  582.         60,10,
  583.         CHECKED+CHECKIT+ITEMTEXT+ITEMENABLED+HIGHCOMP,
  584.         0xfffffff7,
  585.         (APTR)&IText24,
  586.         NULL,
  587.         NULL,
  588.         NULL,
  589.         0xFFFF
  590. };
  591.  
  592. struct IntuiText IText25 = {
  593.         3,1,COMPLEMENT,
  594.         20,1,
  595.         NULL,
  596.         (UBYTE *)"  60 ",
  597.         NULL
  598. };
  599.  
  600. struct MenuItem SubItem16 = {
  601.         &SubItem17,
  602.         45,12,
  603.         60,10,
  604.         CHECKIT+ITEMTEXT+ITEMENABLED+HIGHCOMP,
  605.         0xfffffffb,
  606.         (APTR)&IText25,
  607.         NULL,
  608.         NULL,
  609.         NULL,
  610.         0xFFFF
  611. };
  612.  
  613. struct IntuiText IText26 = {
  614.         3,1,COMPLEMENT,
  615.         20,1,
  616.         NULL,
  617.         (UBYTE *)"  75 ",
  618.         NULL
  619. };
  620.  
  621. struct MenuItem SubItem15 = {
  622.         &SubItem16,
  623.         45,2,
  624.         60,10,
  625.         CHECKIT+ITEMTEXT+ITEMENABLED+HIGHCOMP,
  626.         0xfffffffd,
  627.         (APTR)&IText26,
  628.         NULL,
  629.         NULL,
  630.         NULL,
  631.         0xFFFF
  632. };
  633.  
  634. struct IntuiText IText27 = {
  635.         3,1,COMPLEMENT,
  636.         20,1,
  637.         NULL,
  638.         (UBYTE *)"  90 ",
  639.         NULL
  640. };
  641.  
  642. struct MenuItem SubItem14 = {
  643.         &SubItem15,
  644.         45,-8,
  645.         60,10,
  646.         CHECKIT+ITEMTEXT+ITEMENABLED+HIGHCOMP,
  647.         0xfffffffe,
  648.         (APTR)&IText27,
  649.         NULL,
  650.         NULL,
  651.         NULL,
  652.         0xFFFF
  653. };
  654.  
  655. struct IntuiText IText28 = {
  656.         3,1,COMPLEMENT,
  657.         20,1,
  658.         NULL,
  659.         (UBYTE *)" LAT ",
  660.         NULL
  661. };
  662.  
  663. struct MenuItem MenuItem1 = {
  664.         &MenuItem2,
  665.         0,0,
  666.         60,10,
  667.         ITEMTEXT+ITEMENABLED+HIGHCOMP,
  668.         0,
  669.         (APTR)&IText28,
  670.         NULL,
  671.         NULL,
  672.         &SubItem14,
  673.         0xFFFF
  674. };
  675.  
  676. struct Menu Menu4 = {
  677.         NULL,
  678.         279,0,
  679.         102,0,
  680.         MENUENABLED,
  681.         "   CENTER ",
  682.         &MenuItem1
  683. };
  684.  
  685. struct IntuiText IText29 = {
  686.         3,1,COMPLEMENT,
  687.         20,1,
  688.         NULL,
  689.         (UBYTE *)"ORTHOgraphic",
  690.         NULL
  691. };
  692.  
  693. struct MenuItem MenuItem7 = {
  694.         NULL,
  695.         0,44,
  696.         156,10,
  697.         CHECKED+CHECKIT+ITEMTEXT+COMMSEQ+ITEMENABLED+HIGHCOMP,
  698.         0xffffffef,
  699.         (APTR)&IText29,
  700.         NULL,
  701.         'g',
  702.         NULL,
  703.         0xFFFF
  704. };
  705.  
  706. struct IntuiText IText30 = {
  707.         3,1,COMPLEMENT,
  708.         20,1,
  709.         NULL,
  710.         (UBYTE *)" HAMMER ",
  711.         NULL
  712. };
  713.  
  714. struct MenuItem MenuItem6 = {
  715.         &MenuItem7,
  716.         0,33,
  717.         156,10,
  718.         CHECKIT+ITEMTEXT+COMMSEQ+ITEMENABLED+HIGHCOMP,
  719.         0xfffffff7,
  720.         (APTR)&IText30,
  721.         NULL,
  722.         'h',
  723.         NULL,
  724.         0xFFFF
  725. };
  726.  
  727. struct IntuiText IText31 = {
  728.         3,1,COMPLEMENT,
  729.         20,1,
  730.         NULL,
  731.         (UBYTE *)" SINUS ",
  732.         NULL
  733. };
  734.  
  735. struct MenuItem MenuItem5 = {
  736.         &MenuItem6,
  737.         0,22,
  738.         156,10,
  739.         CHECKIT+ITEMTEXT+COMMSEQ+ITEMENABLED+HIGHCOMP,
  740.         0xfffffffb,
  741.         (APTR)&IText31,
  742.         NULL,
  743.         's',
  744.         NULL,
  745.         0xFFFF
  746. };
  747.  
  748. struct IntuiText IText32 = {
  749.         3,1,COMPLEMENT,
  750.         20,1,
  751.         NULL,
  752.         (UBYTE *)" EquiCyl ",
  753.         NULL
  754. };
  755.  
  756. struct MenuItem MenuItem4 = {
  757.         &MenuItem5,
  758.         0,11,
  759.         156,10,
  760.         CHECKIT+ITEMTEXT+COMMSEQ+ITEMENABLED+HIGHCOMP,
  761.         0xfffffffd,
  762.         (APTR)&IText32,
  763.         NULL,
  764.         'e',
  765.         NULL,
  766.         0xFFFF
  767. };
  768.  
  769. struct IntuiText IText33 = {
  770.         3,1,COMPLEMENT,
  771.         20,1,
  772.         NULL,
  773.         (UBYTE *)"MERCATOR ",
  774.         NULL
  775. };
  776.  
  777. struct MenuItem MenuItem3 = {
  778.         &MenuItem4,
  779.         0,0,
  780.         156,10,
  781.         CHECKIT+ITEMTEXT+COMMSEQ+ITEMENABLED+HIGHCOMP,
  782.         0xfffffffe,
  783.         (APTR)&IText33,
  784.         NULL,
  785.         'm',
  786.         NULL,
  787.         0xFFFF
  788. };
  789.  
  790. struct Menu Menu3 = {
  791.         &Menu4,
  792.         189,0,
  793.         84,0,
  794.         MENUENABLED,
  795.         "   TYPE ",
  796.         &MenuItem3
  797. };
  798.  
  799. struct IntuiText IText34 = {
  800.         3,1,COMPLEMENT,
  801.         20,1,
  802.         NULL,
  803.         (UBYTE *)" 45 ",
  804.         NULL
  805. };
  806.  
  807. struct MenuItem SubItem31 = {
  808.         NULL,
  809.         117,32,
  810.         52,10,
  811.         CHECKIT+ITEMTEXT+ITEMENABLED+HIGHCOMP,
  812.         0xffffffef,
  813.         (APTR)&IText34,
  814.         NULL,
  815.         NULL,
  816.         NULL,
  817.         0xFFFF
  818. };
  819.  
  820. struct IntuiText IText35 = {
  821.         3,1,COMPLEMENT,
  822.         20,1,
  823.         NULL,
  824.         (UBYTE *)" 30 ",
  825.         NULL
  826. };
  827.  
  828. struct MenuItem SubItem30 = {
  829.         &SubItem31,
  830.         117,22,
  831.         52,10,
  832.         CHECKIT+ITEMTEXT+ITEMENABLED+HIGHCOMP,
  833.         0xfffffff7,
  834.         (APTR)&IText35,
  835.         NULL,
  836.         NULL,
  837.         NULL,
  838.         0xFFFF
  839. };
  840.  
  841. struct IntuiText IText36 = {
  842.         3,1,COMPLEMENT,
  843.         20,1,
  844.         NULL,
  845.         (UBYTE *)" 15 ",
  846.         NULL
  847. };
  848.  
  849. struct MenuItem SubItem29 = {
  850.         &SubItem30,
  851.         117,12,
  852.         52,10,
  853.         CHECKED+CHECKIT+ITEMTEXT+ITEMENABLED+HIGHCOMP,
  854.         0xfffffffb,
  855.         (APTR)&IText36,
  856.         NULL,
  857.         NULL,
  858.         NULL,
  859.         0xFFFF
  860. };
  861.  
  862. struct IntuiText IText37 = {
  863.         3,1,COMPLEMENT,
  864.         20,1,
  865.         NULL,
  866.         (UBYTE *)" 10 ",
  867.         NULL
  868. };
  869.  
  870. struct MenuItem SubItem28 = {
  871.         &SubItem29,
  872.         117,2,
  873.         52,10,
  874.         CHECKIT+ITEMTEXT+ITEMENABLED+HIGHCOMP,
  875.         0xfffffffd,
  876.         (APTR)&IText37,
  877.         NULL,
  878.         NULL,
  879.         NULL,
  880.         0xFFFF
  881. };
  882.  
  883. struct IntuiText IText38 = {
  884.         3,1,COMPLEMENT,
  885.         20,1,
  886.         NULL,
  887.         (UBYTE *)"  5 ",
  888.         NULL
  889. };
  890.  
  891. struct MenuItem SubItem27 = {
  892.         &SubItem28,
  893.         117,-8,
  894.         52,10,
  895.         CHECKIT+ITEMTEXT+ITEMENABLED+HIGHCOMP,
  896.         0xfffffffe,
  897.         (APTR)&IText38,
  898.         NULL,
  899.         NULL,
  900.         NULL,
  901.         0xFFFF
  902. };
  903.  
  904. struct IntuiText IText39 = {
  905.         3,1,COMPLEMENT,
  906.         20,1,
  907.         NULL,
  908.         (UBYTE *)" LNG++ ",
  909.         NULL
  910. };
  911.  
  912. struct MenuItem MenuItem12 = {
  913.         NULL,
  914.         0,44,
  915.         132,10,
  916.         ITEMTEXT+ITEMENABLED+HIGHCOMP,
  917.         0,
  918.         (APTR)&IText39,
  919.         NULL,
  920.         NULL,
  921.         &SubItem27,
  922.         0xFFFF
  923. };
  924.  
  925. struct IntuiText IText40 = {
  926.         3,1,COMPLEMENT,
  927.         20,1,
  928.         NULL,
  929.         (UBYTE *)" 45 ",
  930.         NULL
  931. };
  932.  
  933. struct MenuItem SubItem36 = {
  934.         NULL,
  935.         117,32,
  936.         52,10,
  937.         CHECKIT+ITEMTEXT+ITEMENABLED+HIGHCOMP,
  938.         0xffffffef,
  939.         (APTR)&IText40,
  940.         NULL,
  941.         NULL,
  942.         NULL,
  943.         0xFFFF
  944. };
  945.  
  946. struct IntuiText IText41 = {
  947.         3,1,COMPLEMENT,
  948.         20,1,
  949.         NULL,
  950.         (UBYTE *)" 30 ",
  951.         NULL
  952. };
  953.  
  954. struct MenuItem SubItem35 = {
  955.         &SubItem36,
  956.         117,22,
  957.         52,10,
  958.         CHECKIT+ITEMTEXT+ITEMENABLED+HIGHCOMP,
  959.         0xfffffff7,
  960.         (APTR)&IText41,
  961.         NULL,
  962.         NULL,
  963.         NULL,
  964.         0xFFFF
  965. };
  966.  
  967. struct IntuiText IText42 = {
  968.         3,1,COMPLEMENT,
  969.         20,1,
  970.         NULL,
  971.         (UBYTE *)" 15 ",
  972.         NULL
  973. };
  974.  
  975. struct MenuItem SubItem34 = {
  976.         &SubItem35,
  977.         117,12,
  978.         52,10,
  979.         CHECKED+CHECKIT+ITEMTEXT+ITEMENABLED+HIGHCOMP,
  980.         0xfffffffb,
  981.         (APTR)&IText42,
  982.         NULL,
  983.         NULL,
  984.         NULL,
  985.         0xFFFF
  986. };
  987.  
  988. struct IntuiText IText43 = {
  989.         3,1,COMPLEMENT,
  990.         20,1,
  991.         NULL,
  992.         (UBYTE *)" 10 ",
  993.         NULL
  994. };
  995.  
  996. struct MenuItem SubItem33 = {
  997.         &SubItem34,
  998.         117,2,
  999.         52,10,
  1000.         CHECKIT+ITEMTEXT+ITEMENABLED+HIGHCOMP,
  1001.         0xfffffffd,
  1002.         (APTR)&IText43,
  1003.         NULL,
  1004.         NULL,
  1005.         NULL,
  1006.         0xFFFF
  1007. };
  1008.  
  1009. struct IntuiText IText44 = {
  1010.         3,1,COMPLEMENT,
  1011.         20,1,
  1012.         NULL,
  1013.         (UBYTE *)"  5 ",
  1014.         NULL
  1015. };
  1016.  
  1017. struct MenuItem SubItem32 = {
  1018.         &SubItem33,
  1019.         117,-8,
  1020.         52,10,
  1021.         CHECKIT+ITEMTEXT+ITEMENABLED+HIGHCOMP,
  1022.         0xfffffffe,
  1023.         (APTR)&IText44,
  1024.         NULL,
  1025.         NULL,
  1026.         NULL,
  1027.         0xFFFF
  1028. };
  1029.  
  1030. struct IntuiText IText45 = {
  1031.         3,1,COMPLEMENT,
  1032.         20,1,
  1033.         NULL,
  1034.         (UBYTE *)" LAT++ ",
  1035.         NULL
  1036. };
  1037.  
  1038. struct MenuItem MenuItem11 = {
  1039.         &MenuItem12,
  1040.         0,33,
  1041.         132,10,
  1042.         ITEMTEXT+ITEMENABLED+HIGHCOMP,
  1043.         0,
  1044.         (APTR)&IText45,
  1045.         NULL,
  1046.         NULL,
  1047.         &SubItem32,
  1048.         0xFFFF
  1049. };
  1050.  
  1051. struct IntuiText IText46 = {
  1052.         3,1,COMPLEMENT,
  1053.         20,1,
  1054.         NULL,
  1055.         (UBYTE *)" FULL ",
  1056.         NULL
  1057. };
  1058.  
  1059. struct MenuItem MenuItem10 = {
  1060.         &MenuItem11,
  1061.         0,22,
  1062.         132,10,
  1063.         CHECKED+CHECKIT+ITEMTEXT+COMMSEQ+ITEMENABLED+HIGHCOMP,
  1064.         0xfffffffb,
  1065.         (APTR)&IText46,
  1066.         NULL,
  1067.         'f',
  1068.         NULL,
  1069.         0xFFFF
  1070. };
  1071.  
  1072. struct IntuiText IText47 = {
  1073.         3,1,COMPLEMENT,
  1074.         20,1,
  1075.         NULL,
  1076.         (UBYTE *)"outline",
  1077.         NULL
  1078. };
  1079.  
  1080. struct MenuItem MenuItem9 = {
  1081.         &MenuItem10,
  1082.         0,11,
  1083.         132,10,
  1084.         CHECKIT+ITEMTEXT+COMMSEQ+ITEMENABLED+HIGHCOMP,
  1085.         0xfffffffd,
  1086.         (APTR)&IText47,
  1087.         NULL,
  1088.         'l',
  1089.         NULL,
  1090.         0xFFFF
  1091. };
  1092.  
  1093. struct IntuiText IText48 = {
  1094.         3,1,COMPLEMENT,
  1095.         20,1,
  1096.         NULL,
  1097.         (UBYTE *)"   OFF   ",
  1098.         NULL
  1099. };
  1100.  
  1101. struct MenuItem MenuItem8 = {
  1102.         &MenuItem9,
  1103.         0,0,
  1104.         132,10,
  1105.         CHECKIT+ITEMTEXT+COMMSEQ+ITEMENABLED+HIGHCOMP,
  1106.         0xfffffffe,
  1107.         (APTR)&IText48,
  1108.         NULL,
  1109.         'o',
  1110.         NULL,
  1111.         0xFFFF
  1112. };
  1113.  
  1114. struct Menu Menu2 = {
  1115.         &Menu3,
  1116.         99,0,
  1117.         84,0,
  1118.         MENUENABLED,
  1119.         "   GRID ",
  1120.         &MenuItem8
  1121. };
  1122.  
  1123. struct IntuiText IText49 = {
  1124.         3,1,COMPLEMENT,
  1125.         20,1,
  1126.         NULL,
  1127.         (UBYTE *)"  About..",
  1128.         NULL
  1129. };
  1130.  
  1131. struct MenuItem MenuItem14 = {
  1132.         NULL,
  1133.         0,11,
  1134.         116,10,
  1135.         ITEMTEXT+ITEMENABLED+HIGHCOMP,
  1136.         0,
  1137.         (APTR)&IText49,
  1138.         NULL,
  1139.         NULL,
  1140.         NULL,
  1141.         0xFFFF
  1142. };
  1143.  
  1144. struct IntuiText IText50 = {
  1145.         3,1,COMPLEMENT,
  1146.         20,1,
  1147.         NULL,
  1148.         (UBYTE *)"  DRAW ",
  1149.         NULL
  1150. };
  1151.  
  1152. struct MenuItem MenuItem13 = {
  1153.         &MenuItem14,
  1154.         0,0,
  1155.         116,10,
  1156.         ITEMTEXT+COMMSEQ+ITEMENABLED+HIGHCOMP,
  1157.         0,
  1158.         (APTR)&IText50,
  1159.         NULL,
  1160.         'd',
  1161.         NULL,
  1162.         0xFFFF
  1163. };
  1164.  
  1165. struct Menu Menu1 = {
  1166.         &Menu2,
  1167.         0,0,
  1168.         93,0,
  1169.         MENUENABLED,
  1170.         "   MAIN  ",
  1171.         &MenuItem13
  1172. };
  1173.  
  1174. #define MenuList Menu1
  1175.  
  1176.  
  1177. /* end of PowerWindows source generation */
  1178.  
  1179.  
  1180. struct NewScreen scrdef = {
  1181.    0, 0, XSIZE+1, YSIZE+1,
  1182.    2,              /*  4 colors  */
  1183.    2, 3,           /*  detail/block pens  */
  1184.                /*  Auto screen format  */
  1185.    ((XSIZE>320) ? HIRES : 0) | ((YSIZE>200) ? LACE : 0),
  1186.    CUSTOMSCREEN,
  1187.    NULL, NULL, NULL, NULL  /* no special font, gadg, title, or bitmap */
  1188. };
  1189.  
  1190. struct NewWindow windef={0,4,639,395,3,2,MOUSEBUTTONS+MENUPICK+CLOSEWINDOW,
  1191. WINDOWCLOSE | WINDOWDEPTH | ACTIVATE,
  1192. NULL,NULL,titlemain,NULL,NULL,0,0,0,0,CUSTOMSCREEN};
  1193.  
  1194.  
  1195.  
  1196. struct IntuitionBase   *IntuitionBase;
  1197. struct GfxBase         *GfxBase;
  1198. struct Screen *scr, *OpenScreen();
  1199. struct Window  *fbwin,*OpenWindow();
  1200. struct IntuiMessage *message, *GetMsg();
  1201. struct RastPort *rp;
  1202. struct ViewPort *vp;
  1203. struct FileLock *alock,*Lock();
  1204. struct FileHandle *filehand,*Open();
  1205.  
  1206.  
  1207. char coordname[] = "map:world.dat";
  1208. long openflag = 0;
  1209. long mclass, mcode, mx, my, alrsmem;
  1210. APTR maddress;
  1211. struct Window *mwin;
  1212.  
  1213. /*
  1214. struct dfrec {
  1215.     char code[2];
  1216.     short longitude;
  1217.     short latitude;
  1218. };
  1219. */
  1220.  
  1221. #ifdef REVISED
  1222. double  Sqrt2        = 1.4142135623731;
  1223. double  PI           = 3.1415926535898;
  1224. double  HalfPI       = 1.5707963267949;
  1225. double  TwoPI        = 6.2831853071796;
  1226. double  Radian       = 1.7453292519943E-2;
  1227. double  RadianDiv100 = 1.7453292519943E-4; /* PI/180/100, needed to convert */
  1228.                                          /* data in WORLD.DAT to radians  */
  1229. #else
  1230. double  Sqrt2;
  1231. double  PI;
  1232. double  HalfPI;
  1233. double  TwoPI;
  1234. double  Radian;
  1235. double  RadianDiv100;
  1236. #endif
  1237.  
  1238. double pink,mpink,sinphi1,cosphi1,r2;
  1239.  
  1240. double L, L1, PHI1, Lambda0;
  1241. double  ASPECT  = 1.14;         /* aspect ratio              */
  1242. double  R;                      /* map radius set by draw    */
  1243.  
  1244.  
  1245. short *buff,*malloc();
  1246.  
  1247. short   XCENTER = 320;          /* AMIGA Graphics constants. */
  1248. short   YCENTER = 207;          /* Screen center X and Y     */
  1249. short   NotVisible = -32767;    /* Flag for point visibility */
  1250. short   LatitudeSpacing;
  1251. short   LongitudeSpacing;
  1252. short   pclng,pclat;
  1253.  
  1254. short LastX, LastY, XP, YP; /* Save variables for plotting */
  1255. short I, J, K, MapType, M, X1,Y1,X2, Y2, SX, SY;
  1256.  
  1257.  
  1258. unsigned char LastPtVis, GRID;
  1259.  
  1260.  
  1261. main ()
  1262. {
  1263. short areabuf[100];
  1264. struct TmpRas tmpras,*InitTmpRas ();
  1265. struct AreaInfo areainfo;
  1266. extern struct FileLock *alock,*Lock();
  1267. extern struct FileHandle *filehand,*Open();
  1268. extern struct RastPort *rp;
  1269. register short *dp;
  1270. register unsigned long i, j, k;
  1271. extern long mclass, mcode, mx, my, alrsmem;
  1272. extern APTR maddress;
  1273. extern struct IntuiMessage *message;
  1274.  
  1275.  
  1276.  
  1277.     if (!(buff = malloc(DFSIZE))) {
  1278.         printf("\nNO MEMORY, never mind.\n");
  1279.         exit(99);
  1280.     }
  1281.    printf("Checking world.dat integrity...\n");
  1282.    if (!(alock = Lock(&coordname,ACCESS_READ))) {
  1283.         printf("NO LOCK on %s\n",coordname);
  1284.         exit(99);
  1285.    }
  1286.     else {
  1287.         if (!(filehand = Open(&coordname,MODE_OLDFILE))) {
  1288.             printf("NO OPEN on %s, error = %d\n",coordname,IoErr());
  1289.             UnLock(alock);
  1290.             exit(99);
  1291.         }
  1292.          else {
  1293.            if ((Read(filehand,buff,DFSIZE)) != DFSIZE) {
  1294.                printf("BAD READ LENGTH or whatever on %s\n",coordname);
  1295.                Close(filehand);
  1296.                UnLock(alock);
  1297.                exit(99);
  1298.            }
  1299.             else {
  1300.                 Close(filehand);
  1301.                 UnLock(alock);
  1302.             }
  1303.         }
  1304.     }
  1305.  
  1306. /* check rec code integrity & convert back-asswards IBM, 6502 type format */
  1307.  
  1308.     for (dp = buff, i = 0; dp < buff + DPOINTS*3; dp+=3, i++) {
  1309.         if ((*dp != 'LS') && (*dp != 'S ')) {
  1310.             printf("\nBad Code in world.dat -- data point # %d\n",i);
  1311.             exit(99);
  1312.         }
  1313.         *(dp+1) = (((*(dp+1)) << 8) & 0xff00) | (((*(dp+1)) >> 8) & 0xff);
  1314.         *(dp+2) = (((*(dp+2)) << 8) & 0xff00) | (((*(dp+2)) >> 8) & 0xff);
  1315.     }
  1316. /**************************************************************************/
  1317.  
  1318.  
  1319.    setupfpc();
  1320.    openthings ();
  1321.    vp = &scr->ViewPort;
  1322.    rp = fbwin->RPort;
  1323.    rp -> Mask = 0xff;
  1324.    InitArea (&areainfo,areabuf,40);
  1325.    rp->AreaInfo = &areainfo;
  1326.    alrsmem = AllocRaster (100,50);
  1327.    rp->TmpRas = InitTmpRas (&tmpras,alrsmem,RASSIZE(100,50));
  1328.    SetDrMd (rp, JAM1);
  1329.    SetAPen(rp,3);
  1330.    GRID = 2;
  1331.  
  1332.    PHI1 = 45 * Radian;      /*  45 */
  1333.    Lambda0 = -90 * Radian;  /* -90 */
  1334.    pclat =  45;
  1335.    pclng = -90;
  1336.  
  1337.    LatitudeSpacing  = 15;  /*  15 */
  1338.    LongitudeSpacing = 15;  /*  15 */
  1339.    MapType = 5;            /*   5 */
  1340.    SetMenuStrip(fbwin,&Menu1);
  1341.    drawmap();
  1342.  
  1343.  
  1344.    FOREVER {
  1345.       Wait (1 << fbwin->UserPort->mp_SigBit);
  1346.       while (message = GetMsg (fbwin->UserPort)) {
  1347.          mclass = message->Class;
  1348.          mcode = message->Code;
  1349.          maddress = message->IAddress;
  1350.          mx = message->MouseX;
  1351.          my = message->MouseY;
  1352.          mwin = message->IDCMPWindow;
  1353.          ReplyMsg (message);
  1354.          if (mclass == CLOSEWINDOW) {
  1355.                FreeRaster (alrsmem,100,50);
  1356.                closethings ();
  1357.                exit (0);
  1358.          }
  1359.          if (mclass == MENUPICK && mcode != MENUNULL) procmenu ();
  1360.       }
  1361.    }
  1362. }
  1363.  
  1364.  
  1365. setupfpc()
  1366. {
  1367. #ifdef P68020
  1368. #asm
  1369.             fmove.w     #2,fp0
  1370.             fsqrt.x     fp0
  1371.             fmove.d     fp0,_Sqrt2
  1372.             fmovecr.x   #0,fp0                  ;move PI to fp0
  1373.             fmove.d     fp0,_PI
  1374.             fscale.w    #1,fp0                  ;2 * pi
  1375.             fmove.d     fp0,_TwoPI
  1376.             fscale.w     #-2,fp0                ;pi / 2
  1377.             fmove.d     fp0,_HalfPI
  1378.             fmovecr.x   #0,fp0                  ;faster than scale
  1379.             fdiv.w      #180,fp0
  1380.             fmove.d     fp0,_Radian
  1381.             fdiv.w      #100,fp0
  1382.             fmove.d     fp0,_RadianDiv100
  1383.             fmovecr.x   #0,fp1
  1384.             fadd.x      fp1,fp0
  1385.             fmove.d     fp0,_pink
  1386.             fneg.x      fp0
  1387.             fmove.d     fp0,_mpink
  1388.             fsincos.d   _PHI1,fp1:fp0
  1389.             fmove.d     fp0,_sinphi1
  1390.             fmove.d     fp1,_cosphi1
  1391.             fmove.d     _R,fp0
  1392.             fscale.w    #1,fp0
  1393.             fmove.d     fp0,_r2
  1394. #endasm
  1395. #else
  1396.     pink=PI+RadianDiv100;
  1397.     mpink=-pink;
  1398.     sinphi1=sin(PHI1);
  1399.     cosphi1=cos(PHI1);
  1400.     r2=R*2;
  1401. #endif
  1402.  
  1403. }
  1404.  
  1405.  
  1406. procmenu()
  1407. {
  1408. extern long mclass, mcode, mx, my;
  1409. extern APTR maddress;
  1410. register short i, j;
  1411. register long menunum, itemnum, subnum;
  1412.  
  1413.     menunum = MENUNUM(mcode);
  1414.     itemnum = ITEMNUM(mcode);
  1415.     subnum  = SUBNUM(mcode);
  1416.     switch (menunum) {
  1417.         case 0 :    /* MAIN */
  1418.             switch (itemnum) {
  1419.                 case 0 :    /* DRAW */
  1420.                     ClearMenuStrip(fbwin);
  1421.                     drawmap();
  1422.                     SetMenuStrip(fbwin,&Menu1);
  1423.                 break;
  1424.                 case 1 :    /* ABOUT */
  1425.                 break;
  1426.                 default :
  1427.                 break;
  1428.             }
  1429.         break;
  1430.         case 1 :    /* GRID */
  1431.             switch (itemnum) {
  1432.                 case 0 :
  1433.                 case 1 :
  1434.                 case 2 :
  1435.                     GRID = itemnum;
  1436.                 break;
  1437.                 case 3:
  1438.                     switch (subnum) {
  1439.                         case 0:
  1440.                         case 1:
  1441.                         case 2:
  1442.                             LatitudeSpacing = (subnum + 1) * 5;
  1443.                         break;
  1444.                         case 3:
  1445.                         case 4:
  1446.                             LatitudeSpacing = (subnum - 1) * 15;
  1447.                         break;
  1448.                     }
  1449.                 break;
  1450.                 case 4:
  1451.                     switch (subnum) {
  1452.                         case 0:
  1453.                         case 1:
  1454.                         case 2:
  1455.                             LongitudeSpacing = (subnum + 1) * 5;
  1456.                         break;
  1457.                         case 3:
  1458.                         case 4:
  1459.                             LongitudeSpacing = (subnum - 1) * 15;
  1460.                         break;
  1461.                     }
  1462.                 break;
  1463.                 default :
  1464.                 break;
  1465.             }
  1466.         break;
  1467.         case 2 :    /* TYPE */
  1468.             MapType = itemnum + 1;
  1469.         break;
  1470.         case 3 :    /* CENTER */
  1471.             if (itemnum) {
  1472.                 pclng = 180 - (subnum * 30);
  1473.                 Lambda0 = pclng * Radian;
  1474.             }
  1475.              else {
  1476.                 pclat = 90 - (subnum * 15);
  1477.                 PHI1  = pclat * Radian;
  1478.             }
  1479.         break;
  1480.     }
  1481. }
  1482.  
  1483.  
  1484. openthings ()
  1485. {
  1486. extern long openflag;
  1487. char *OpenLibrary();
  1488.  
  1489.    if (!(IntuitionBase = (struct IntuitionBase *)
  1490.       OpenLibrary ("intuition.library", 1L))) {
  1491.          printf ("Intuition open failure.\n");
  1492.          exit (FALSE);
  1493.    }
  1494.    openflag |= 0x01;
  1495.  
  1496.    if (!(GfxBase = (struct GfxBase *)
  1497.       OpenLibrary ("graphics.library", 1L))) {
  1498.          printf ("Graphics library open failure.\n");
  1499.          closethings ();
  1500.          exit (FALSE);
  1501.    }
  1502.    openflag |= 0x02;
  1503.  
  1504.  
  1505.    if (!(scr = OpenScreen (&scrdef))) {
  1506.          printf ("Screen open failure.\n");
  1507.          closethings ();
  1508.          exit (FALSE);
  1509.    }
  1510.    openflag |= 0x10;
  1511.  
  1512.    windef.Screen = scr;
  1513.    if (!(fbwin = OpenWindow (&windef))) {
  1514.          printf ("Window open failure.\n");
  1515.          closethings ();
  1516.          exit (FALSE);
  1517.    }
  1518.    openflag |= 0x20;
  1519. }
  1520.  
  1521.  
  1522. closethings ()
  1523. {
  1524.  
  1525.    if (openflag & 0x20) CloseWindow (fbwin);
  1526.    if (openflag & 0x10) CloseScreen (scr);
  1527.    if (openflag & 0x02) CloseLibrary (GfxBase);
  1528.    if (openflag & 0x01) CloseLibrary (IntuitionBase);
  1529. }
  1530.  
  1531.  
  1532. clrscreen ()
  1533. {
  1534. extern struct RastPort *rp;
  1535.  
  1536.    SetAPen (rp,0L);
  1537.    RectFill (rp,2,10,637,392);
  1538. }
  1539.  
  1540.  
  1541.  
  1542. drawmap()
  1543. {
  1544. register double LONGR,LATR,X,Y;
  1545. register int    XP,YP,LastX,LastY;
  1546. register short  *pp;
  1547. double MaxLat =   80 * Radian;   /* 80 degrees. for Mercator */
  1548. double lam0 = Lambda0;
  1549. double K;
  1550. double CosC, CosL, SinPhi, CosPhi; /* Orthographic */
  1551.  
  1552.     switch (MapType) {
  1553.         case 1:
  1554.             R=70;
  1555.         break;
  1556.         case 2:
  1557.             R=85;
  1558.         break;
  1559.         case 3:
  1560.             R=85;
  1561.         break;
  1562.         case 4:
  1563.             R=95;
  1564.         break;
  1565.         case 5:
  1566.             R=90;
  1567.         break;
  1568.     }
  1569.     setupfpc();
  1570.     clrscreen();
  1571.     if (GRID == 2)              drawgrid(0);
  1572.      else if (GRID == 1)        drawgrid(1);
  1573.     SetAPen(rp,3);
  1574.     X = Y = 0;      /* printf hangs if try to print NAN */
  1575.  
  1576.     for (pp = buff; pp < buff + DPOINTS*3; pp+=3) {
  1577.         if (*pp == 'LS')    LastPtVis = FALSE;
  1578.         LONGR = (*(pp+1) * RadianDiv100) - lam0;
  1579.         LATR  = *(pp+2) * RadianDiv100;
  1580.         if (LONGR < mpink)            LONGR += TwoPI;
  1581.          else if (LONGR >  pink)      LONGR -= TwoPI;
  1582.  
  1583.         switch (MapType) {
  1584.             case 1: /* MERCATOR */
  1585.                 if (fabs(LATR) < MaxLat) {
  1586.                     X = R * LONGR;
  1587. #ifdef REVISED
  1588.                     Y = R * atan(sin(LATR)); 
  1589. #else
  1590.                     Y = R * atanh(sin(LATR));
  1591. #endif
  1592.                 }
  1593.                  else X = NotVisible;
  1594.             break;
  1595.             case 2: /* EQUICYL */
  1596.                 X = R * LONGR * cosphi1;
  1597.                 Y = R * LATR;
  1598.             break;
  1599.             case 3: /* SINUSOIDAL */
  1600.                  X = R * cos(LATR) * LONGR ;
  1601.                  Y = R * LATR;
  1602.             break;
  1603.             case 4: /* HAMMER */
  1604.                 LONGR *= .5;
  1605. /*                K = R * Sqrt2 / sqrt(1.0 + cos(LATR) * cos(LONGR));*/
  1606. /* Compiler generates incorrect code for this statement: namely a
  1607.  jsr mulu# (integer multiply) for the product cos(LATR) * cos(LONGR)    */
  1608.                 K = R * Sqrt2 / sqrt(1.0 + (double)cos(LATR) * cos(LONGR));
  1609.                 X = 2 * K * cos(LATR) * (sin(LONGR));
  1610.                 Y = K * sin(LATR);
  1611.             break;
  1612.             case 5: /* ORTHOGRAPHIC */
  1613.                 CosPhi  = cos(LATR);
  1614.                 SinPhi  = sin(LATR);
  1615.                 CosL    = cos(LONGR)*CosPhi;
  1616.                 CosC    = sinphi1 * SinPhi + cosphi1 * CosL;
  1617.                 if (CosC >= 0) {
  1618.                     X = r2 * CosPhi * sin(LONGR);
  1619.                     Y = r2 * (cosphi1 * SinPhi - sinphi1 * CosL);
  1620.                 }
  1621.                  else X = NotVisible;
  1622.             break;
  1623.         }
  1624.         if (message=GetMsg(fbwin->UserPort)) {
  1625.             ReplyMsg(message);
  1626.             return();
  1627.         }
  1628.         if (X > -300) {
  1629.             XP=(short)(X*ASPECT)+XCENTER;
  1630.             if ((ABS(LastX-XP)) > 100)        LastPtVis=FALSE;
  1631.             YP= YCENTER-((short)(Y));
  1632.             if (LastPtVis) {
  1633.                 Move(rp,LastX,LastY);
  1634.                 Draw(rp,XP,YP);
  1635.             }
  1636.             LastPtVis=TRUE;
  1637.             LastX=XP;
  1638.             LastY=YP;
  1639.         }
  1640.          else LastPtVis=FALSE;
  1641.     }
  1642. }
  1643.  
  1644.  
  1645. drawgrid(outline)
  1646. USHORT outline;
  1647. {
  1648. register double LONGR,LATR,X,Y;
  1649. register int    XP,YP,LastX,LastY;
  1650. static short ol=1;
  1651. short Longitude, Latitude, LatLimit, MaxLat, LongIncr, LatIncr;
  1652. double LL, PP, A, RA, XN, YN, SINDT, COSDT;
  1653. double K;
  1654. double CosC, CosL, SinPhi, CosPhi; /* Orthographic */
  1655. double lam0 = Lambda0,LONGR2;
  1656.  
  1657.     if (!outline)       drawgrid(ol);
  1658.     SetAPen(rp,2);
  1659.     switch(MapType) {
  1660.         case 1:
  1661.             MaxLat=80;
  1662.             LongIncr=360;
  1663.             LatIncr=160;
  1664.             sprintf(anytext,"  < MERCATOR >  MAP CENTER: Long. = %4d  Lat. = %3d*  ",\
  1665.              pclng,pclat);
  1666.         break;
  1667.         case 2:
  1668.             MaxLat=90;
  1669.             LongIncr=360;
  1670.             LatIncr=180;
  1671.             sprintf(anytext,"  < EQUIDISTANT CLYINDRICAL >  MAP CENTER: Long. = %4d  Lat. = %3d  ",\
  1672.              pclng,pclat);
  1673.         break;
  1674.         case 3:
  1675.             MaxLat=90;
  1676.             LongIncr=360;
  1677.             LatIncr=5;
  1678.             sprintf(anytext,"  < SINUSOIDAL >  MAP CENTER: Long. = %4d  Lat. = %3d*  ",\
  1679.              pclng,pclat);
  1680.         break;
  1681.         case 4:
  1682.             MaxLat=90;
  1683.             LongIncr=5;
  1684.             LatIncr=5;
  1685.             sprintf(anytext,"  < HAMMER >  MAP CENTER: Long. = %4d  Lat. = %3d*  ",\
  1686.              pclng,pclat);
  1687.         break;
  1688.         case 5:
  1689.             MaxLat=90;
  1690.             LongIncr=5;
  1691.             LatIncr=5;
  1692.             sprintf(anytext,"  < ORTHOGRAPHIC >  MAP CENTER: Long. = %4d  Lat. = %3d  ",\
  1693.              pclng,pclat);
  1694.         break;
  1695.     }
  1696.     lam0=0;  PP=PHI1;
  1697.  
  1698.     if (outline) {
  1699.         if (MapType == 5)       PP=0;
  1700.         PrintIText(rp,&anyprint,(640 -((strlen(anytext)) << 3)) >> 1,12);
  1701.         LatLimit = MaxLat;              /* Draw only extreme latitudes */
  1702.                                         /* to make map outline         */
  1703.     }
  1704.      else {
  1705.         LatLimit = (MaxLat/LatitudeSpacing)*LatitudeSpacing;
  1706.     }
  1707.     Latitude = LatLimit;
  1708.     while (Latitude >= -LatLimit) {      /* Draw parallels */
  1709.         LATR = Latitude*Radian;
  1710.         LastPtVis = FALSE;
  1711.         Longitude = -180;
  1712.         while (Longitude <= 180) {
  1713.             LONGR = Longitude * Radian;
  1714.             LONGR -= lam0;
  1715.             if (LONGR < mpink)            LONGR += TwoPI;
  1716.              else if (LONGR > pink)       LONGR -= TwoPI;
  1717.             switch (MapType) {
  1718.                 case 1: /* MERCATOR */
  1719.                     if (fabs(LATR) < MaxLat) {
  1720.                         X = R * LONGR;
  1721. #ifdef REVISED
  1722.                         Y = R * atan(sin(LATR));
  1723. #else                        
  1724.                         Y = R * atanh(sin(LATR));
  1725. #endif
  1726.                         }
  1727.                      else X = NotVisible;
  1728.                 break;
  1729.                 case 2: /* EQUICYL */
  1730.                     X = R * LONGR * cosphi1;
  1731.                     Y = R * LATR;
  1732.                 break;
  1733.                 case 3: /* SINUSOIDAL */
  1734.                     X = R * cos(LATR) * LONGR ;
  1735.                     Y = R * LATR;
  1736.                 break;
  1737.                 case 4: /* HAMMER */
  1738.                     LONGR *= .5;
  1739.                     K = R * Sqrt2 / sqrt(1.0 + (double)cos(LATR) * cos(LONGR));
  1740.                     X = 2 * K * cos(LATR) * (sin(LONGR));
  1741.                     Y = K * sin(LATR);
  1742.                 break;
  1743.                 case 5: /* ORTHOGRAPHIC */
  1744. /*                    R2=R+R;
  1745.                     CosPhi1 = cos(PP);
  1746.                     SinPhi1 = sin(PP);*/
  1747. /*        There was no need to compute these every data point so I didn't. */
  1748.  
  1749.                     CosPhi  = cos(LATR);
  1750.                     SinPhi  = sin(LATR);
  1751.                     CosL    = cos(LONGR)*CosPhi;
  1752.                     CosC    = sinphi1 * SinPhi + cosphi1 * CosL;
  1753.                     if (CosC >= 0) {
  1754.                         X = r2 * CosPhi * sin(LONGR);
  1755.                         Y = r2 * (cosphi1 * SinPhi - sinphi1 * CosL);
  1756.                     }
  1757.                      else X = NotVisible;
  1758.                 break;
  1759.             }/*switch*/
  1760.  
  1761.             if (X > -300) {
  1762.                 XP=(short)(X*ASPECT)+XCENTER;
  1763.                 YP= YCENTER-((short)(Y));
  1764.                 if (LastPtVis) {
  1765.                     Move(rp,LastX,LastY);
  1766.                     Draw(rp,XP,YP);
  1767.                 }
  1768.                 LastPtVis=TRUE;
  1769.                 LastX=XP;
  1770.                 LastY=YP;
  1771.             }
  1772.              else LastPtVis=FALSE;
  1773.  
  1774.           Longitude += LongIncr;
  1775.        } /* while long */
  1776.        if (outline)         Latitude -= (2*MaxLat);
  1777.         else                Latitude -= LatitudeSpacing;
  1778.     } /* while lat */
  1779.  
  1780.  
  1781.  
  1782.     if (outline) lam0 = 0;
  1783.      else lam0 = Lambda0;
  1784.     Longitude = -180;                   /* Draw meridians */
  1785.     while (Longitude <= 180) {
  1786.         LONGR2 = Longitude * Radian;
  1787.         LastPtVis = FALSE;
  1788.         Latitude = MaxLat;
  1789.         while (Latitude >= -MaxLat) {
  1790.             LATR = Latitude * Radian;
  1791.             LONGR = LONGR2 - lam0;
  1792.             if (LONGR < mpink)            LONGR += TwoPI;
  1793.              else if (LONGR >  pink)      LONGR -= TwoPI;
  1794.             switch (MapType) {
  1795.                 case 1: /* MERCATOR */
  1796.                     if (fabs(LATR) < MaxLat) {
  1797.                         X = R * LONGR;
  1798. #ifdef REVISED                        
  1799.                         Y = R * atan(sin(LATR)); 
  1800. #else
  1801.                         Y = R * atanh(sin(LATR)); 
  1802. #endif
  1803.                     }
  1804.                      else X = NotVisible;
  1805.                 break;
  1806.                 case 2: /* EQUICYL */
  1807.                     X = R * LONGR * cosphi1;
  1808.                     Y = R * LATR;
  1809.                 break;
  1810.                 case 3: /* SINUSOIDAL */
  1811.                     X = R * cos(LATR) * LONGR ;
  1812.                     Y = R * LATR;
  1813.                 break;
  1814.                 case 4: /* HAMMER */
  1815.                     LONGR *= 0.5;
  1816.                     K = R * Sqrt2 / sqrt(1.0 + (double)cos(LATR) * cos(LONGR));
  1817.                     X = 2 * K * cos(LATR) * sin(LONGR);
  1818.                     Y = K * sin(LATR);
  1819.                 break;
  1820.                 case 5: /* ORTHOGRAPHIC */
  1821.                     CosPhi  = cos(LATR);
  1822.                     SinPhi  = sin(LATR);
  1823.                     CosL    = cos(LONGR)*CosPhi;
  1824.                     CosC    = sinphi1 * SinPhi + cosphi1 * CosL;
  1825.                     if (CosC >= 0) {
  1826.                         X = r2 * CosPhi * sin(LONGR);
  1827.                         Y = r2 * (cosphi1 * SinPhi - sinphi1 * CosL);
  1828.                     }
  1829.                      else X = NotVisible;
  1830.                 break;
  1831.             }/*switch*/
  1832.  
  1833.             if (X > -300) {
  1834.                 XP = (short)(X*ASPECT)+XCENTER;
  1835.                 YP = YCENTER-((short)(Y));
  1836.                 if (LastPtVis) {
  1837.                     Move(rp,LastX,LastY);
  1838.                     Draw(rp,XP,YP);
  1839.                 }
  1840.                 LastPtVis=TRUE;
  1841.                 LastX=XP;
  1842.                 LastY=YP;
  1843.             }
  1844.              else LastPtVis=FALSE;
  1845.             Latitude -= LatIncr;
  1846.         }/*while*/
  1847.  
  1848.         if (outline)        Longitude += 360;
  1849.          else               Longitude += LongitudeSpacing;
  1850.     }/*while*/
  1851.  
  1852.  
  1853.     if ((outline) && (MapType==5)) {
  1854. /*        A=0;                           /* Draw circular outline
  1855.         RA = r2 * ASPECT;
  1856.         SINDT= 0.05996400648;
  1857.         COSDT= 0.99820053993;
  1858.         X=1;   Y=0;
  1859.         XP= XCENTER + (short)RA;
  1860.         YP= YCENTER;
  1861.         LastX=XP;
  1862.         LastY=YP;
  1863.         while (A <= TwoPI) {       /* Compute points on the circle
  1864.             XN= X * COSDT - Y * SINDT;
  1865.             YN= X * SINDT + Y * COSDT;
  1866.             X= XN;  Y= YN;
  1867.             XP= XCENTER + (short)(X*RA);
  1868.             YP= YCENTER + (short)(Y*r2);
  1869.             Move(rp,LastX,LastY);
  1870.             Draw(rp,XP,YP);
  1871.             LastX=XP;
  1872.             LastY=YP;
  1873.             A+=0.06;
  1874.         }
  1875. */
  1876.     DrawEllipse(rp,XCENTER,YCENTER,(int)(r2*ASPECT),(int)(r2));
  1877.     }
  1878. }
  1879. /* The damn floating point routine is faster than DrawElipse() !! */
  1880.  
  1881.